package com.model;

import java.io.Serializable;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import com.model.enuns.TipoUsuario;

@Entity
@Table(name = "usuario")
public class Usuario implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id = 0;
    @Column(length = 40, unique=true)
    private String login;
    
    @Column(length = 40)
    private String password;
    
    @Column(length = 200)
    private String nome;
    
    @Column(length = 80)
    private String email;
    
    @Enumerated(EnumType.STRING)
    @Column(length = TipoUsuario.MAX_COLUMN_LENGTH)
    private TipoUsuario tipo;
    
    @Basic
    private boolean ativo = true;

    @Transient
    private int numeroSolicitacoesAtivas;

    @Transient
    private int numeroSolicitacoesFinalizadas;

    @Transient
    private int numeroAvaliacoesSatisfeitas;

    @Transient
    private int numeroAvaliacoesInsatisfeitas;
    
    @Transient
    private int numeroAvaliacoesIndiferentes;
    

    public int getNumeroSolicitacoesAtivas() {
        return numeroSolicitacoesAtivas;
    }
    public void setNumeroSolicitacoesAtivas(int numeroSolicitacoesAtivas) {
        this.numeroSolicitacoesAtivas = numeroSolicitacoesAtivas;
    }

    public int getNumeroSolicitacoesFinalizadas() {
        return numeroSolicitacoesFinalizadas;
    }

    public void setNumeroSolicitacoesFinalizadas(int numeroSolicitacoesFinalizadas) {
        this.numeroSolicitacoesFinalizadas = numeroSolicitacoesFinalizadas;
    }
    
    public int getNumeroAvaliacoesIndiferentes() {
        return numeroAvaliacoesIndiferentes;
    }

    public void setNumeroAvaliacoesIndiferentes(int numeroAvaliacoesIndiferentes) {
        this.numeroAvaliacoesIndiferentes = numeroAvaliacoesIndiferentes;
    }

    public int getNumeroAvaliacoesInsatisfeitas() {
        return numeroAvaliacoesInsatisfeitas;
    }

    public void setNumeroAvaliacoesInsatisfeitas(int numeroAvaliacoesInsatisfeitas) {
        this.numeroAvaliacoesInsatisfeitas = numeroAvaliacoesInsatisfeitas;
    }

    public int getNumeroAvaliacoesSatisfeitas() {
        return numeroAvaliacoesSatisfeitas;
    }

    public void setNumeroAvaliacoesSatisfeitas(int numeroAvaliacoesSatisfeitas) {
        this.numeroAvaliacoesSatisfeitas = numeroAvaliacoesSatisfeitas;
    }
    
    public int getNumeroAvaliacoes(){
        return this.numeroAvaliacoesIndiferentes + this.numeroAvaliacoesInsatisfeitas + this.numeroAvaliacoesInsatisfeitas;
    }
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public TipoUsuario getTipo() {
        return tipo;
    }

    public void setTipo(TipoUsuario tipo) {
        this.tipo = tipo;
    }

    public boolean isSolicitante() {
        return (this.tipo == TipoUsuario.SOLICITANTE);
    }

    public boolean isChefe() {
        return (this.tipo == TipoUsuario.CHEFE);
    }

    public boolean isAtendente() {
        return (this.tipo == TipoUsuario.ATENDENTE);
    }
    
    @Override
    public String toString(){
        String result = this.nome;
        if(isAtendente() || isChefe()){
            result  += String.format(" (%d)", this.numeroSolicitacoesAtivas);
        }
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.id != other.id) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 17 * hash + (int) (this.id ^ (this.id >>> 32));
        return hash;
    }

}

